package com.skyyan.netty.jjf.test;

import java.util.Arrays;

/**
 * 数字转字节工具类
 */
public class NumberToBytesConverter {
    
    /**
     * 将整数转换为3字节的字节数组，低位在前，高位在后（小端序）
     * 
     * @param no 要转换的整数
     * @return 3字节的字节数组
     * @throws IllegalArgumentException 如果数字超出了3字节能表示的范围
     */
    public static byte[] convertTo3Bytes(int no) throws IllegalArgumentException {
        // 3字节能表示的范围是 0 到 0xFFFFFF (16777215)
        // 0xFFFFFF 是合法的最大值
        if (no < 0 || no > 0xFFFFFF) {
            throw new IllegalArgumentException("数字超出3字节表示范围: " + no);
        }
        
        byte[] bytes = new byte[3];
        // 使用小端序（低位在前，高位在后）
        bytes[0] = (byte) (no & 0xFF);         // 最低位字节
        bytes[1] = (byte) ((no >> 8) & 0xFF);  // 中间字节
        bytes[2] = (byte) ((no >> 16) & 0xFF); // 最高位字节
        
        return bytes;
    }
    
    /**
     * 将3字节的字节数组转换回整数，低位在前，高位在后（小端序）
     * 
     * @param bytes 3字节的字节数组
     * @return 转换后的整数
     * @throws IllegalArgumentException 如果字节数组长度不是3
     */
    public static int convertFrom3Bytes(byte[] bytes) throws IllegalArgumentException {
        if (bytes == null || bytes.length != 3) {
            throw new IllegalArgumentException("字节数组必须是3字节长度");
        }
        
        // 按小端序还原整数
        return (bytes[0] & 0xFF) | 
               ((bytes[1] & 0xFF) << 8) | 
               ((bytes[2] & 0xFF) << 16);
    }
    
    public static void main(String[] args) {
        try {
            // 测试示例
            int no = 0x123456; // 示例数字
            System.out.println("原始数字: 0x" + Integer.toHexString(no).toUpperCase());
            
            // 转换为3字节
            byte[] bytes = convertTo3Bytes(no);
            System.out.println("转换为3字节（低位在前）: " + Arrays.toString(bytes));
            System.out.println("十六进制表示: " + 
                String.format("0x%02X 0x%02X 0x%02X", bytes[0], bytes[1], bytes[2]));
            
            // 转换回整数验证
            int restored = convertFrom3Bytes(bytes);
            System.out.println("还原后的数字: 0x" + Integer.toHexString(restored).toUpperCase());
            System.out.println("转换正确: " + (no == restored));
            
            // 更多测试用例
            System.out.println("\n--- 更多测试用例 ---");
            testConversion(0x532201);
            testConversion(0x000001);
            testConversion(0xFFFFFF);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static void testConversion(int no) {
        try {
            System.out.println("\n测试数字: 0x" + Integer.toHexString(no).toUpperCase());
            byte[] bytes = convertTo3Bytes(no);
            System.out.println("  3字节表示: " + Arrays.toString(bytes));
            System.out.println("  十六进制: " + 
                String.format("0x%02X 0x%02X 0x%02X", bytes[0], bytes[1], bytes[2]));
            
            int restored = convertFrom3Bytes(bytes);
            System.out.println("  还原结果: 0x" + Integer.toHexString(restored).toUpperCase());
            System.out.println("  转换正确: " + (no == restored));
        } catch (Exception e) {
            System.out.println("  错误: " + e.getMessage());
        }
    }
}